Tile
沿着指定的维度 tile_dim,将输入张量的基础块重复平铺 tile_num 次。该算子通过“加倍拷贝法”利用 DMA 传输实现高效的数据复制。
\[\begin{split}\text{对于输入张量,其在维度 } tile\_dim \text{ 及其之后维度的连续块大小为 } stride \text{ 个元素。} \\
\text{算子将该块在输出中连续复制 } tile\_num \text{ 次,构造出平铺后的维度效果。}\end{split}\]
- 输入:
input - 输入张量数据地址。
output - 输出张量数据地址。
input_shape - 输入张量的形状数组地址。
tile_dim - 执行平铺操作的维度索引(0 到 ndim-1)。
tile_num - 在指定维度上平铺的次数。
stride - 平铺块的长度。通常定义为从
tile_dim维度到最后一个维度所有形状值的乘积。core_mask(int, 可选) - 核掩码(仅适用于共享存储版本)。
- 输出:
output - 填充后的平铺结果地址。
- 支持平台:
FT78NEMT7004
备注
FT78NE 支持 int8, int16, int32, fp32, fp64, cplx64, cplx128
MT7004 支持 fp16, fp32, int16, int32, cplx64
对于复数类型(cplx64/cplx128),
stride依然表示复数元素的个数,算子内部会自动处理双倍宽度的内存拷贝。算子内部使用 DMA 传输,能够有效提升 DDR 到 DDR 的拷贝效率。
共享存储版本:
-
void i8_tile_s(int8_t *input, int8_t *output, int *input_shape, int tile_dim, int tile_num, int stride, int core_mask)
-
void i16_tile_s(int16_t *input, int16_t *output, int *input_shape, int tile_dim, int tile_num, int stride, int core_mask)
-
void i32_tile_s(int32_t *input, int32_t *output, int *input_shape, int tile_dim, int tile_num, int stride, int core_mask)
-
void hp_tile_s(half *input, half *output, int *input_shape, int tile_dim, int tile_num, int stride, int core_mask)
-
void fp_tile_s(float *input, float *output, int *input_shape, int tile_dim, int tile_num, int stride, int core_mask)
-
void dp_tile_s(double *input, double *output, int *input_shape, int tile_dim, int tile_num, int stride, int core_mask)
-
void c64_tile_s(float *input, float *output, int *input_shape, int tile_dim, int tile_num, int stride, int core_mask)
-
void c128_tile_s(double *input, double *output, int *input_shape, int tile_dim, int tile_num, int stride, int core_mask)
C调用示例:
1// FT78NE 示例:多核并行平铺 2#include <stdio.h> 3#include "78NE/utils.h" 4 5int main() { 6 float *input = (float *)0xA0000000; 7 float *output = (float *)0xB0000000; 8 int input_shape[] = {16, 20, 16, 24}; 9 int tile_dim = 2; 10 int tile_num = 10; 11 int stride = 16 * 24; // tile_dim[2]*input_shape[3] 12 int core_mask = 0b1011; 13 14 fp_tile_s(input, output, input_shape, tile_dim, tile_num, stride, core_mask); 15 return 0; 16}
私有存储版本:
-
void i8_tile_p(int8_t *input, int8_t *output, int *input_shape, int tile_dim, int tile_num, int stride)
-
void i16_tile_p(int16_t *input, int16_t *output, int *input_shape, int tile_dim, int tile_num, int stride)
-
void i32_tile_p(int32_t *input, int32_t *output, int *input_shape, int tile_dim, int tile_num, int stride)
-
void hp_tile_p(half *input, half *output, int *input_shape, int tile_dim, int tile_num, int stride)
-
void fp_tile_p(float *input, float *output, int *input_shape, int tile_dim, int tile_num, int stride)
-
void dp_tile_p(double *input, double *output, int *input_shape, int tile_dim, int tile_num, int stride)
-
void c64_tile_p(float *input, float *output, int *input_shape, int tile_dim, int tile_num, int stride)
-
void c128_tile_p(double *input, double *output, int *input_shape, int tile_dim, int tile_num, int stride)
C调用示例:
1// MT7004 示例:单核私有空间平铺 2#include <stdio.h> 3 4int main() { 5 float *input = (float *)0x10000000; 6 float *output = (float *)0x10010000; 7 int input_shape[] = {4, 10, 8, 12}; 8 int tile_dim = 2; 9 int tile_num = 5; 10 int stride = 8 * 12; 11 12 fp_tile_p(input, output, input_shape, tile_dim, tile_num, stride); 13 return 0; 14}